Load the data and setup properly
The table to analyze
datatable(f_all,
filter = "top",
class = "cell-border stripe",
extensions = c("AutoFill",
#"Buttons",
"ColReorder",
"KeyTable",
"Responsive",
"RowReorder"),
options = list(pageLength = 20,
lengthMenu = c(5, 10, 15, 20, 25, 50, 100, 250, 500, 1000),
order = list(list(7, "desc")),
autofill = TRUE,
#dom = "Bfrtip",
#buttons = c("copy", "csv", "excel", "pdf", "print"),
colReorder = TRUE,
keys = TRUE,
rowReorder = TRUE)
) %>% formatStyle(c("Raw_Gain_M", "Raw_Cover_M", "Raw_Freq_M"),
background = styleColorBar(c(0, f_all$Raw_Gain_M[order(f_all$Raw_Gain_M, decreasing = TRUE)[2]]), 'lightgreen'),
backgroundSize = '100% 90%',
backgroundRepeat = 'no-repeat',
backgroundPosition = 'center') %>%
formatStyle(c("TS_Gain_M", "TS_Cover_M", "TS_Freq_M"),
background = styleColorBar(c(0, f_all$TS_Gain_M[order(f_all$TS_Gain_M, decreasing = TRUE)[2]]), 'pink'),
backgroundSize = '100% 90%',
backgroundRepeat = 'no-repeat',
backgroundPosition = 'center') %>%
formatStyle(c("Raw_Count", "TS_Count"),
background = styleColorBar(c(0, 5), 'lightgrey'),
backgroundSize = '100% 90%',
backgroundRepeat = 'no-repeat',
backgroundPosition = 'center') %>%
formatPercentage(columns = c("Raw_Gain_M", "TS_Gain_M", "Raw_Cover_M", "TS_Cover_M", "Raw_Freq_M", "TS_Freq_M"),
digits = 4)
Some plots
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Gain_M, y = TS_Gain_M, color = Raw_Rank, color2 = TS_Rank)) + labs(title = "TS Gain vs Raw Gain, Rank Multivariate", x = "Raw Gain", y = "Time-Series Gain") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Gain Rank", axis_title_y = "TS Gain Rank") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Cover_M, y = TS_Cover_M, color = Raw_Rank, color2 = TS_Rank)) + labs(title = "TS Cover vs Raw Cover, Rank Multivariate", x = "Raw Cover", y = "Time-Series Cover") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Gain Rank", axis_title_y = "TS Gain Rank") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Freq_M, y = TS_Freq_M, color = Raw_Rank, color2 = TS_Rank)) + labs(title = "TS Freq vs Raw Freq, Rank Multivariate", x = "Raw Freq", y = "Time-Series Freq") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Gain Rank", axis_title_y = "TS Gain Rank") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Rank, y = TS_Rank, color = Raw_Gain_M, color2 = TS_Gain_M)) + labs(title = "TS Gain Rank vs Raw Gain Rank, Non-Rank Multivariate", x = "Raw Gain Rank", y = "Time-Series Gain Rank") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Gain", axis_title_y = "TS Gain") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Rank, y = TS_Rank, color = Raw_Cover_M, color2 = TS_Cover_M)) + labs(title = "TS Gain Rank vs Raw Gain Rank, Cover Multivariate", x = "Raw Gain Rank", y = "Time-Series Gain Rank") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Cover", axis_title_y = "TS Cover") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
plotting <- ggplot(as.data.frame(f_all)[1:(nrow(f_all) - 2), ], aes(x = Raw_Rank, y = TS_Rank, color = Raw_Freq_M, color2 = TS_Freq_M)) + labs(title = "TS Gain Rank vs Raw Gain Rank, Freq Multivariate", x = "Raw Gain Rank", y = "Time-Series Gain Rank") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Raw Freq", axis_title_y = "TS Freq") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
LS0tDQp0aXRsZTogIkNvbXBhcmUgTnVtZXJpYyBUaW1lIFNlcmllcyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6IGRpc2NyZXRpemF0aW9uLmNzcw0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogZGlzY3JldGl6YXRpb24uY3NzDQotLS0NCg0KIyBMb2FkIHRoZSBkYXRhIGFuZCBzZXR1cCBwcm9wZXJseQ0KDQpgYGB7cn0NCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNvbG9ycGxhbmVyKQ0KbGlicmFyeShnZ2lyYXBoKQ0KZl9pbXAxIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAwLCBuY29sID0gNCkpDQpmX2ltcDIgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDAsIG5jb2wgPSA0KSkNCmZfZm9sZCA8LSBsaXN0KCkNCnNldHdkKCJFOi8iKQ0KZm9yIChpIGluIDE6NSkgew0KICBmX2ltcDEgPC0gcmJpbmQoZl9pbXAxLCBjYmluZChmcmVhZChwYXN0ZSgiTGF1cmFlLzIwMTYxMDE3X3Rlc3RfbnVtZXJpYy9iZXN0X2ZlYXR1cmVzIiwgaSwgIi5jc3YiLCBzZXAgPSAiIiksIGRhdGEudGFibGUgPSBGQUxTRSksIEZvbGQgPSBpKSkNCiAgZl9pbXAyIDwtIHJiaW5kKGZfaW1wMiwgY2JpbmQoZnJlYWQocGFzdGUoIkxhdXJhZS8yMDE2MTAxN190ZXN0X3RzL2Jlc3RfZmVhdHVyZXMiLCBpLCAiLmNzdiIsIHNlcCA9ICIiKSwgZGF0YS50YWJsZSA9IEZBTFNFKSwgRm9sZCA9IGkpKQ0KfQ0KDQpmX2ltcDFfbWVhbiA8LSBhZ2dyZWdhdGUoZl9pbXAxWywgYygiR2FpbiIsICJDb3ZlciIsICJGcmVxdWVuY3kiKV0sIGJ5ID0gbGlzdChGZWF0dXJlID0gZl9pbXAxJEZlYXR1cmUpLCBtZWFuKQ0KY29sbmFtZXMoZl9pbXAxX21lYW4pIDwtIGMoIkZlYXR1cmUiLCAiUmF3X0dhaW5fTSIsICJSYXdfQ292ZXJfTSIsICJSYXdfRnJlcV9NIikNCmZfaW1wMV9tZWFuJFJhd19SYW5rIDwtIChucm93KGZfaW1wMV9tZWFuKSArIDEpIC0gcmFuayhmX2ltcDFfbWVhbiRSYXdfR2Fpbl9NLCB0aWVzLm1ldGhvZCA9ICJtYXgiKQ0KZl9pbXAxX3NkIDwtIGFnZ3JlZ2F0ZShmX2ltcDFbLCBjKCJHYWluIiwgIkNvdmVyIiwgIkZyZXF1ZW5jeSIpXSwgYnkgPSBsaXN0KEZlYXR1cmUgPSBmX2ltcDEkRmVhdHVyZSksIHNkKQ0KZl9pbXAxX3NkW2lzLm5hKGZfaW1wMV9zZCldIDwtIDANCmNvbG5hbWVzKGZfaW1wMV9zZCkgPC0gYygiRmVhdHVyZSIsICJSYXdfR2Fpbl9TRCIsICJSYXdfQ292ZXJfU0QiLCAiUmF3X0ZyZXFfU0QiKQ0KZl9pbXAxX2xlbiA8LSBhZ2dyZWdhdGUoZl9pbXAxWywgYygiRmVhdHVyZSIpXSwgYnkgPSBsaXN0KEZlYXR1cmUgPSBmX2ltcDEkRmVhdHVyZSksIGxlbmd0aCkNCmNvbG5hbWVzKGZfaW1wMV9sZW4pIDwtIGMoIkZlYXR1cmUiLCAiUmF3X0NvdW50IikNCmZfaW1wMSA8LSBjYmluZChmX2ltcDFfbWVhbiwgZl9pbXAxX3NkWywgLTFdLCBSYXdfQ291bnQgPSBmX2ltcDFfbGVuWywgLTFdKQ0KZl9pbXAyX21lYW4gPC0gYWdncmVnYXRlKGZfaW1wMlssIGMoIkdhaW4iLCAiQ292ZXIiLCAiRnJlcXVlbmN5IildLCBieSA9IGxpc3QoRmVhdHVyZSA9IGZfaW1wMiRGZWF0dXJlKSwgbWVhbikNCmNvbG5hbWVzKGZfaW1wMl9tZWFuKSA8LSBjKCJGZWF0dXJlIiwgIlRTX0dhaW5fTSIsICJUU19Db3Zlcl9NIiwgIlRTX0ZyZXFfTSIpDQpmX2ltcDJfbWVhbiRUU19SYW5rIDwtIChucm93KGZfaW1wMV9tZWFuKSArIDEpIC0gcmFuayhmX2ltcDJfbWVhbiRUU19HYWluX00sIHRpZXMubWV0aG9kID0gIm1heCIpDQpmX2ltcDJfc2QgPC0gYWdncmVnYXRlKGZfaW1wMlssIGMoIkdhaW4iLCAiQ292ZXIiLCAiRnJlcXVlbmN5IildLCBieSA9IGxpc3QoRmVhdHVyZSA9IGZfaW1wMiRGZWF0dXJlKSwgc2QpDQpmX2ltcDJfc2RbaXMubmEoZl9pbXAyX3NkKV0gPC0gMA0KY29sbmFtZXMoZl9pbXAyX3NkKSA8LSBjKCJGZWF0dXJlIiwgIlRTX0dhaW5fU0QiLCAiVFNfQ292ZXJfU0QiLCAiVFNfRnJlcV9TRCIpDQpmX2ltcDJfbGVuIDwtIGFnZ3JlZ2F0ZShmX2ltcDJbLCBjKCJGZWF0dXJlIildLCBieSA9IGxpc3QoRmVhdHVyZSA9IGZfaW1wMiRGZWF0dXJlKSwgbGVuZ3RoKQ0KY29sbmFtZXMoZl9pbXAyX2xlbikgPC0gYygiRmVhdHVyZSIsICJUU19Db3VudCIpDQpmX2ltcDIgPC0gY2JpbmQoZl9pbXAyX21lYW4sIGZfaW1wMl9zZFssIC0xXSwgVFNfQ291bnQgPSBmX2ltcDJfbGVuWywgLTFdKQ0KI2ZfaW1wMSA8LSBhcy5kYXRhLnRhYmxlKGZfaW1wMSkNCiNmX2ltcDIgPC0gYXMuZGF0YS50YWJsZShmX2ltcDIpDQoNCmZfYWxsIDwtIGRhdGEudGFibGUoZGF0YS5mcmFtZShGZWF0dXJlID0gYygiTGVha1N0YXJ0IiwgIkxlYWtFbmQiLCBmcmVhZCgiRTovTGF1cmFlL1RpbWVTZXJpZXMvdXNlZF9jb2x1bW5zLmNzdiIpJHgpKSkNCmZfYWxsIDwtIG1lcmdlKGZfYWxsLCBmX2ltcDEsIGJ5ID0gIkZlYXR1cmUiLCBhbGwueCA9IFRSVUUpDQpmX2FsbCA8LSBtZXJnZShmX2FsbCwgZl9pbXAyLCBieSA9ICJGZWF0dXJlIiwgYWxsLnggPSBUUlVFKQ0KZl9hbGxbaXMubmEoZl9hbGwpXSA8LSAwDQpmX2FsbCA8LSBmX2FsbFssIGMoMSwgOSwgMTcsIDUsIDEzLCAyLCAxMCwgMywgMTEsIDQsIDEyKSwgd2l0aCA9IEZBTFNFXQ0KI2ZfYWxsIDwtIGZfYWxsWywgYygxLCA5LCAxNywgNSwgMTMsIDIsIDEwLCA2LCAxNCwgMywgMTEsIDcsIDE1LCA0LCAxMiwgOCwgMTYpLCB3aXRoID0gRkFMU0VdDQoNCmBgYA0KDQojIFRoZSB0YWJsZSB0byBhbmFseXplDQoNCmBgYHtyfQ0KZGF0YXRhYmxlKGZfYWxsLA0KICAgICAgICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsDQogICAgICAgICAgZXh0ZW5zaW9ucyA9IGMoIkF1dG9GaWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIkJ1dHRvbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xSZW9yZGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5VGFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNwb25zaXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiUm93UmVvcmRlciIpLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhNZW51ID0gYyg1LCAxMCwgMTUsIDIwLCAyNSwgNTAsIDEwMCwgMjUwLCA1MDAsIDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyID0gbGlzdChsaXN0KDcsICJkZXNjIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9maWxsID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAjZG9tID0gIkJmcnRpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgI2J1dHRvbnMgPSBjKCJjb3B5IiwgImNzdiIsICJleGNlbCIsICJwZGYiLCAicHJpbnQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xSZW9yZGVyID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICByb3dSZW9yZGVyID0gVFJVRSkNCiAgICAgICAgICApICU+JSBmb3JtYXRTdHlsZShjKCJSYXdfR2Fpbl9NIiwgIlJhd19Db3Zlcl9NIiwgIlJhd19GcmVxX00iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IHN0eWxlQ29sb3JCYXIoYygwLCBmX2FsbCRSYXdfR2Fpbl9NW29yZGVyKGZfYWxsJFJhd19HYWluX00sIGRlY3JlYXNpbmcgPSBUUlVFKVsyXV0pLCAnbGlnaHRncmVlbicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZSA9ICcxMDAlIDkwJScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQgPSAnbm8tcmVwZWF0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlcicpICU+JQ0KICAgICAgICAgICAgICAgIGZvcm1hdFN0eWxlKGMoIlRTX0dhaW5fTSIsICJUU19Db3Zlcl9NIiwgIlRTX0ZyZXFfTSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gc3R5bGVDb2xvckJhcihjKDAsIGZfYWxsJFRTX0dhaW5fTVtvcmRlcihmX2FsbCRUU19HYWluX00sIGRlY3JlYXNpbmcgPSBUUlVFKVsyXV0pLCAncGluaycpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZSA9ICcxMDAlIDkwJScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQgPSAnbm8tcmVwZWF0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlcicpICU+JQ0KICAgICAgICAgICAgICAgIGZvcm1hdFN0eWxlKGMoIlJhd19Db3VudCIsICJUU19Db3VudCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gc3R5bGVDb2xvckJhcihjKDAsIDUpLCAnbGlnaHRncmV5JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRTaXplID0gJzEwMCUgOTAlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFJlcGVhdCA9ICduby1yZXBlYXQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb24gPSAnY2VudGVyJykgJT4lDQogICAgICAgICAgICAgICAgZm9ybWF0UGVyY2VudGFnZShjb2x1bW5zID0gYygiUmF3X0dhaW5fTSIsICJUU19HYWluX00iLCAiUmF3X0NvdmVyX00iLCAiVFNfQ292ZXJfTSIsICJSYXdfRnJlcV9NIiwgIlRTX0ZyZXFfTSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gNCkNCmBgYA0KDQojIFNvbWUgcGxvdHMNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTQsIGZpZy53aWR0aD0xOH0NCnBsb3R0aW5nIDwtIGdncGxvdChhcy5kYXRhLmZyYW1lKGZfYWxsKVsxOihucm93KGZfYWxsKSAtIDIpLCBdLCBhZXMoeCA9IFJhd19HYWluX00sIHkgPSBUU19HYWluX00sIGNvbG9yID0gUmF3X1JhbmssIGNvbG9yMiA9IFRTX1JhbmspKSArIGxhYnModGl0bGUgPSAiVFMgR2FpbiB2cyBSYXcgR2FpbiwgUmFuayBNdWx0aXZhcmlhdGUiLCB4ID0gIlJhdyBHYWluIiwgeSA9ICJUaW1lLVNlcmllcyBHYWluIikgKyB0aGVtZV9idygpICsgZ2VvbV9ydWcoKSArIHNjYWxlX2NvbG9yX2NvbG9ycGxhbmUoYXhpc190aXRsZSA9ICJSYXcgR2FpbiBSYW5rIiwgYXhpc190aXRsZV95ID0gIlRTIEdhaW4gUmFuayIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpLCBmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSkgKyBnZW9tX3BvaW50X2ludGVyYWN0aXZlKGFlcyh0b29sdGlwID0gRmVhdHVyZSksIHNpemUgPSAyKQ0KcGxvdHRpbmcgPC0gZ2dwbG90KGFzLmRhdGEuZnJhbWUoZl9hbGwpWzE6KG5yb3coZl9hbGwpIC0gMiksIF0sIGFlcyh4ID0gUmF3X0NvdmVyX00sIHkgPSBUU19Db3Zlcl9NLCBjb2xvciA9IFJhd19SYW5rLCBjb2xvcjIgPSBUU19SYW5rKSkgKyBsYWJzKHRpdGxlID0gIlRTIENvdmVyIHZzIFJhdyBDb3ZlciwgUmFuayBNdWx0aXZhcmlhdGUiLCB4ID0gIlJhdyBDb3ZlciIsIHkgPSAiVGltZS1TZXJpZXMgQ292ZXIiKSArIHRoZW1lX2J3KCkgKyBnZW9tX3J1ZygpICsgc2NhbGVfY29sb3JfY29sb3JwbGFuZShheGlzX3RpdGxlID0gIlJhdyBHYWluIFJhbmsiLCBheGlzX3RpdGxlX3kgPSAiVFMgR2FpbiBSYW5rIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMiksIGZhY2UgPSAiYm9sZCIpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpKSArIGdlb21fcG9pbnRfaW50ZXJhY3RpdmUoYWVzKHRvb2x0aXAgPSBGZWF0dXJlKSwgc2l6ZSA9IDIpDQpnZ2lyYXBoKGNvZGUgPSBwcmludChwbG90dGluZyksIHdpZHRoX3N2ZyA9IDE4LCBoZWlnaHRfc3ZnID0gMTQsIHpvb21fbWF4ID0gNSkNCnBsb3R0aW5nIDwtIGdncGxvdChhcy5kYXRhLmZyYW1lKGZfYWxsKVsxOihucm93KGZfYWxsKSAtIDIpLCBdLCBhZXMoeCA9IFJhd19GcmVxX00sIHkgPSBUU19GcmVxX00sIGNvbG9yID0gUmF3X1JhbmssIGNvbG9yMiA9IFRTX1JhbmspKSArIGxhYnModGl0bGUgPSAiVFMgRnJlcSB2cyBSYXcgRnJlcSwgUmFuayBNdWx0aXZhcmlhdGUiLCB4ID0gIlJhdyBGcmVxIiwgeSA9ICJUaW1lLVNlcmllcyBGcmVxIikgKyB0aGVtZV9idygpICsgZ2VvbV9ydWcoKSArIHNjYWxlX2NvbG9yX2NvbG9ycGxhbmUoYXhpc190aXRsZSA9ICJSYXcgR2FpbiBSYW5rIiwgYXhpc190aXRsZV95ID0gIlRTIEdhaW4gUmFuayIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpLCBmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSkgKyBnZW9tX3BvaW50X2ludGVyYWN0aXZlKGFlcyh0b29sdGlwID0gRmVhdHVyZSksIHNpemUgPSAyKQ0KZ2dpcmFwaChjb2RlID0gcHJpbnQocGxvdHRpbmcpLCB3aWR0aF9zdmcgPSAxOCwgaGVpZ2h0X3N2ZyA9IDE0LCB6b29tX21heCA9IDUpDQpwbG90dGluZyA8LSBnZ3Bsb3QoYXMuZGF0YS5mcmFtZShmX2FsbClbMToobnJvdyhmX2FsbCkgLSAyKSwgXSwgYWVzKHggPSBSYXdfUmFuaywgeSA9IFRTX1JhbmssIGNvbG9yID0gUmF3X0dhaW5fTSwgY29sb3IyID0gVFNfR2Fpbl9NKSkgKyBsYWJzKHRpdGxlID0gIlRTIEdhaW4gUmFuayB2cyBSYXcgR2FpbiBSYW5rLCBOb24tUmFuayBNdWx0aXZhcmlhdGUiLCB4ID0gIlJhdyBHYWluIFJhbmsiLCB5ID0gIlRpbWUtU2VyaWVzIEdhaW4gUmFuayIpICsgdGhlbWVfYncoKSArIGdlb21fcnVnKCkgKyBzY2FsZV9jb2xvcl9jb2xvcnBsYW5lKGF4aXNfdGl0bGUgPSAiUmF3IEdhaW4iLCBheGlzX3RpdGxlX3kgPSAiVFMgR2FpbiIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpLCBmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSkgKyBnZW9tX3BvaW50X2ludGVyYWN0aXZlKGFlcyh0b29sdGlwID0gRmVhdHVyZSksIHNpemUgPSAyKQ0KZ2dpcmFwaChjb2RlID0gcHJpbnQocGxvdHRpbmcpLCB3aWR0aF9zdmcgPSAxOCwgaGVpZ2h0X3N2ZyA9IDE0LCB6b29tX21heCA9IDUpDQpwbG90dGluZyA8LSBnZ3Bsb3QoYXMuZGF0YS5mcmFtZShmX2FsbClbMToobnJvdyhmX2FsbCkgLSAyKSwgXSwgYWVzKHggPSBSYXdfUmFuaywgeSA9IFRTX1JhbmssIGNvbG9yID0gUmF3X0NvdmVyX00sIGNvbG9yMiA9IFRTX0NvdmVyX00pKSArIGxhYnModGl0bGUgPSAiVFMgR2FpbiBSYW5rIHZzIFJhdyBHYWluIFJhbmssIENvdmVyIE11bHRpdmFyaWF0ZSIsIHggPSAiUmF3IEdhaW4gUmFuayIsIHkgPSAiVGltZS1TZXJpZXMgR2FpbiBSYW5rIikgKyB0aGVtZV9idygpICsgZ2VvbV9ydWcoKSArIHNjYWxlX2NvbG9yX2NvbG9ycGxhbmUoYXhpc190aXRsZSA9ICJSYXcgQ292ZXIiLCBheGlzX3RpdGxlX3kgPSAiVFMgQ292ZXIiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSwgZmFjZSA9ICJib2xkIiksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSkpICsgZ2VvbV9wb2ludF9pbnRlcmFjdGl2ZShhZXModG9vbHRpcCA9IEZlYXR1cmUpLCBzaXplID0gMikNCmdnaXJhcGgoY29kZSA9IHByaW50KHBsb3R0aW5nKSwgd2lkdGhfc3ZnID0gMTgsIGhlaWdodF9zdmcgPSAxNCwgem9vbV9tYXggPSA1KQ0KcGxvdHRpbmcgPC0gZ2dwbG90KGFzLmRhdGEuZnJhbWUoZl9hbGwpWzE6KG5yb3coZl9hbGwpIC0gMiksIF0sIGFlcyh4ID0gUmF3X1JhbmssIHkgPSBUU19SYW5rLCBjb2xvciA9IFJhd19GcmVxX00sIGNvbG9yMiA9IFRTX0ZyZXFfTSkpICsgbGFicyh0aXRsZSA9ICJUUyBHYWluIFJhbmsgdnMgUmF3IEdhaW4gUmFuaywgRnJlcSBNdWx0aXZhcmlhdGUiLCB4ID0gIlJhdyBHYWluIFJhbmsiLCB5ID0gIlRpbWUtU2VyaWVzIEdhaW4gUmFuayIpICsgdGhlbWVfYncoKSArIGdlb21fcnVnKCkgKyBzY2FsZV9jb2xvcl9jb2xvcnBsYW5lKGF4aXNfdGl0bGUgPSAiUmF3IEZyZXEiLCBheGlzX3RpdGxlX3kgPSAiVFMgRnJlcSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpLCBmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSkgKyBnZW9tX3BvaW50X2ludGVyYWN0aXZlKGFlcyh0b29sdGlwID0gRmVhdHVyZSksIHNpemUgPSAyKQ0KZ2dpcmFwaChjb2RlID0gcHJpbnQocGxvdHRpbmcpLCB3aWR0aF9zdmcgPSAxOCwgaGVpZ2h0X3N2ZyA9IDE0LCB6b29tX21heCA9IDUpDQpgYGANCg0K